在這次鐵人賽的最後,我想要來講加密傳輸資料
我們用之前提到的 Let’s Encript 來獲得憑證
在 nginx/sites-available
再增加一個網站設定,然後再做個連結到 nginx/sites-enabled
,設定的內容就隨便寫個 server_name
和 listen
就好了
server{
listen 80;
server_name database.mydomain.com;
}
然後 sudo certbot run
,按照之前的步驟來獲得憑證
要讓安全憑證給 MongoDB 使用,我們要先把公私鑰合併成一個 .pem
檔
sudo cat /etc/letsencrypt/archive/’+[db_domain]+’/{fullchain1.pem,privkey1.pem} | sudo tee /etc/letsencrypt/live/’+[db_domain]+’/mongo.pem
我們可以選擇使用 TLS 或 SSL 加密,TLS 是比較新,更安全的加密技術,所以我是選擇用 TLS
在 mongod.cfg
加入以下內容
net:
tls:
mode: requireTLS
certificateKeyFile: /etc/letsencrypt/live/[db_domain]/mongo.pem
port: 27017
bindIp: 127.0.0.1, your-domain
Let’s Encript 的 certbot
工具有提供自動更新憑證的方法,但是我們需要更新憑證後重新合成一個 mongo.pem
,然後重啟 MongoDB,所以我寫了一個 python script 在做這件事
import os, time, datetime
# global settings ###################################
password=[your password]
renew_days=10
# mongo pem #########################################
db_domain=[your db domain]
db_server_path=[your db path]
while True:
print('\n'*5)
print(str(datetime.datetime.now())[0:19])
os.popen("sudo -S %s"%('certbot renew'), 'w').write(password)
time.sleep(5)
print('nginx reload')
os.popen("sudo -S %s"%('nginx -s reload -v'), 'w').write(password)
# mongo pem ######################
print('\n'*5)
print('killall mongod')
os.system('killall mongod')
time.sleep(5)
print('\n'*2)
print('generate mongo.pem')
os.popen("sudo -S %s"%('cat /etc/letsencrypt/archive/'+db_domain+'/{fullchain1.pem,privkey1.pem} | ')
+"sudo -S %s"%('tee /etc/letsencrypt/live/'+db_domain+'/mongo.pem'), 'w').write(password)
time.sleep(5)
print('\n'*2)
print('start mongodb')
os.chdir(db_server_path)
os.system('mongod --config mongod.cfg --fork')
# every ${renew_days} ################
print('\n'*5)
print('try to renew the certificate every '+str(renew_days)+' days')
time.sleep(86400*renew_days)
現在後端想要連接 MongoDB,必須在 connect string 結尾加上 ?tls=true&tlsAllowInvalidCertificate=true
如果想要透過 mongodump
匯出資料庫,要在 connect string 結尾加上 --ssl --tlsInsecure